Skip to content

为什么 []==![] 为true?

解析

== 运算符的左操作数是空数组 [],它是内存中具有唯一引用的对象。右操作数是空数组 ![] 的逻辑非,其计算结果为 false。由于 false 是原始值,因此它不是对象,并且在内存中没有引用。

当使用 == 运算符将对象与非对象值进行比较时,JavaScript 首先使用ToObject内部操作将非对象值转换为对象。如果为 false,ToObject操作将在内存中创建一个具有唯一引用的新布尔对象。因此,比较 [] == ![] 实际上是在空数组和值为false的布尔对象之间进行的。由于两个操作数的类型不同,因此 JavaScript 会应用类型强制规则,在比较之前将一个或两个操作数转换为通用类型。

在这种情况下,两个操作数都转换为数字,因为 == 运算符对数组和非数组对象进行比较有特殊规则。通过调用数组的toString()方法将数组转换为数字,该方法返回一个空字符串,然后将其转换为 0。通过调用布尔对象的 valueOf() 方法将布尔对象转换为数字,该方法返回 0 表示 false。因此比较 [] == ![] 相当于 0 == 0,即 true。